perm filename III[G,BGB]4 blob sn#054440 filedate 1973-07-20 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001	   VALID 00015 PAGES
C00003 00002	III DISPLAY SUBROUTINES - BGB - JANUARY 1973.
C00004 00003	SUBRS DPYSET,DPYBIG,DPYBRT	Set buffer,char. size, brightness*
C00006 00004	SUBRS AVECT,AIVECT,RVECT,RIVECT	Vectors
C00009 00005	SUBRS DPYSTR,DTYO,DPYOUT	Output string,character, POG	*
C00012 00006	SUBRS OCTDPY,DECDPY,FLODPY	Numeric display			*
C00033 ENDMK
C⊗;
;III DISPLAY SUBROUTINES - BGB - JANUARY 1973.
	↓A←1↔↓B←2↔↓C←3
INTERN BUFDPY,DPYPTR
BUFDPY:	.+2↔=100↔BLOCK =100

INTERN DPYBUF
DPYBUF:	DPYBU.↔=2048 
DPYBU.: BLOCK =2048

IGNORE:	BLOCK 1
SIZBRT:	BLOCK 1
DPYCOL:	BLOCK 1
DPYPTR:	BLOCK 1
BUFEND:	BLOCK 1
BUFHD:	BLOCK 2		;UPG ARGUMENT. ;ADDRESS ↔ LENGTH.
DDSAVE:	BLOCK 1

;VERNIER III TEXT POSITIONING.
	VERNX ←← 14
	VERNY ←← 11
;SUBRS DPYSET,DPYBIG,DPYBRT	;Set buffer,char. size, brightness*

SUBR(DPYSET,BUFFER)	;Initialize a display buffer			*
;____________________________________________________________________
	LAC 1,BUFFER↔CDR 2,-1(1)	;BUFFER SIZE.
	ADDI 2,-1(1)↔DAC 2,BUFEND
	ADDI 1,2↔DAC 1,BUFHD		;POINT TO THIRD WORD.
	SETZM IGNORE
	SETZM SIZBRT
CLR2:	LAC A,BUFHD	;BLIT THE BUFFER WITH THE III-TEXT OPCODE 1.
	LACI B,1↔DAC B,1(A)
	LACI B,2(A)↔LIPI B,1(A)
	BLT B,@BUFEND
	PUSH P,(P)↔GO LV3
ENDR DPYSET

SUBR(DPYBIG,SIZE)	;Set character size
;____________________________________________________________________
;USES AC 1
	LAC A,SIZE↔DPB A,[POINT 3,SIZBRT,27]	;REMEMBER NEW SIZE
	POP1J
ENDR DPYBIG
;____________________________________________________________________

SUBR(DPYBRT,SIZE)	;Set brightness
;USES AC 1
	LAC A,SIZE↔DPB A,[POINT 3,SIZBRT,24]	;REMEMBER NEW BRIGHTNESS
	POP1J
ENDR DPYBRT
;SUBRS AVECT,AIVECT,RVECT,RIVECT	;Vectors
INTERN RIVECT,RVECT,AIVECT,AVECT
COMMENT ⊗
	The  III display  processor  is  a stored  program  computer,
these  III subroutines  make  a III  program using  only  two display
operations: the  long vector operation  and the  text operation.  The
pointer to the display buffer is  always maintained as a BYTE POINTER
to  the last character displayed.  The flag named  IGNORE is set when
display buffer  overflow occurs  and  all further  display calls  are
ignored  until the buffer  is used.  The III instruction  formats are
given below, unlike  most CPU  (but like must  display processors  of
its day)  the immediate data  fields are in  the left portion  of the
instruction and the opcode in the right.
	TEXT DISPLAY WORD:	 ASCII/ABCDE/ + 1
	LONG VECTOR  WORD:  BYTE(11)X,Y(3)BRT,SIZ(7)OPCODE
The  long vector opcodes appear in the following four lines: ⊗

;USES AC 1-3
;DTYO DEPENDS ON THIS
RIVECT: SKIPA C,[046]		;RELATIVE INVISIBLE VECTOR.
RVECT:	LACI  C, 006 ↔GO LV0	;RELATIVE   VISIBLE VECTOR.
AIVECT:	SKIPA C,[146]		;ABSOLUTE INVISIBLE VECTOR.
AVECT:	LACI  C, 106		;ABSOLUTE   VISIBLE VECTOR.
	SETZM DPYCOL		;RESET TAB LOCATION

LV0:	SKIPGE IGNORE↔POP2J
LV:	LAC A,-2(P)↔LAC B,-1(P)		;PICKUP X AND Y.
LVC:	DPB A,[POINT 11,C,10]		;PACK X INTO III-WORD.
	DPB B,[POINT 11,C,21]		;PACK Y INTO III-WORD.
	SKIPE A,SIZBRT			;NEW BRIGHTNESS OR SIZE?
	GO [ IOR C,A↔DZM SIZBRT↔GO LV2]	;YES, SET IT
LV2:	AOS A,DPYPTR↔DAC C,(A)		;PACK WORD INTO III-BUFFER.
LV3:	LIPI A,<(<POINT 7,0,35>)>	;UPDATE DPYPTR...
	DAC A,DPYPTR↔LACI A,(A)		;WHICH IS A BYTE-POINTER.
	CAML A,BUFEND↔SETOM IGNORE	;CHECK FOR BUFFER OVERFLOW.
	POP2J
;SUBRS DPYSTR,DTYO,DPYOUT	;Output string,character, POG	*
;____________________________________________________________________

SUBR(DPYSTR,TEXT)
;USES AC 1,3
	LAC 3,TEXT↔LIPI 3,440700
	ILDB 3↔JUMPE POP1J.
	CALL(DTYO,0)↔GO DPYSTR+2
ENDR DPYSTR
;____________________________________________________________________

SUBR(DTYO,CHAR)
;USES AC 1
;DPYSTR DEPENDS ON DTYO NOT CLOBBERING 3
	SKIPE SIZBRT
	GO [ PUSHP 0↔PUSHP 2↔PUSHP 3
	     CALL(RIVECT,[0],[0])
	     POPP 3↔POPP 2↔POPP 0
	     GO .+1]
	LAC 1,CHAR
	CAIN 1,15
	SETOM DPYCOL
	CAIN 1,11
	GO DOTAB
DTYO1:	IDPB 1,DPYPTR
	AOS DPYCOL
	CDR 1,DPYPTR↔CAML 1,BUFEND
	SETOM IGNORE↔POP1J
DOTAB:	CALL(DTYO,[" "])	;We got a tab, put out spaces until
	LAC 1,DPYCOL		;column is divisible by 8
	TRNE 1,7
	GO DOTAB
	CDR 1,DPYPTR
	POP1J
ENDR DTYO
;____________________________________________________________________

SUBR DPYOUT,POG
;	EXTERNAL IIISIM,OVERLAY,DDCHAN
	SKIPN 1,BUFHD↔GO .+6
	LAC 2,DPYPTR↔DAC 2,-2(1)
	LACI 2,2(2)↔SUB 2,1↔DAC 2,-1(1)
	CDR B,DPYPTR↔SUB B,BUFHD
	AOS B↔DAC B,BUFHD+1
	LAC 1,POG↔DPB A,[POINT 4,UPGOP,12]
	SETOM 2↔TTYUUO 6,2
	JUMPGE 2,[ TLNN 2,020000
		   POP1J
		   SKIPN 2,@DDSAVE
		   GO [ LAC 2,[XWD 400000,177]
			CALLI 2,400067
			GO [ OUTSTR[ASCIZ/NO DATA DISC CHANNELS LEFT.
/]↔			     GO L1 ]
			HRRZM 2,@DDSAVE
			GO L1 ]
	    L1:	   HRRZM 2,DDCHAN
		   CALL(IIISIM,UPGOP)
		   SETOM OVERLAY
		   MOVEI 2,1
		   MOVN 1,DDCHAN
		   ROT 2,-1(1)
		   LAC 1,[XWD 002000,2]
		   VDSMAP 1,
		   JFCL
		   POP1J ]
	XCT UPGOP
	POP1J
UPGOP:	703B8+BUFHD
ENDR DPYOUT
DECLARE{IIISIM,OVERLAY,DDCHAN}
;____________________________________________________________________

SUBR DDSET,PDDCHAN
	LAC 1,PDDCHAN
	DAC 1,DDSAVE
	SETZM OVERLAY
	POP1J
ENDR DDSET
;SUBRS OCTDPY,DECDPY,FLODPY	;Numeric display			*
;____________________________________________________________________

SUBR(OCTDPY,INTEGER)	;OCTAL NUMBER DISPLAY.
	Q←15 ↔ N←13
	SKIPA↔GO L2
	LAC 14,INTEGER↔LAC Q,[POINT 3,14,-1]↔LACI N,6
L1:	ILDB Q↔IORI 60↔CALL(DTYO,0)↔SOJG N,L1
	CALL(DTYO,[" "])
L2:	LAC 14,INTEGER↔LAC Q,[POINT 3,14,17]↔LACI N,6
L3:	ILDB Q↔IORI 60↔CALL(DTYO,0)↔SOJG N,L3
	POP1J
ENDR OCTDPY;25-MAR-73(BGB)
;____________________________________________________________________

SUBR(DECDPY,INTEGER)	;DECIMAL NUMBER DISPLAY.
	LAC 1,INTEGER↔POPP -1(P)	;FETCH ARG AND LAC RET. ADR.
L1:	JUMPGE 1,L2			;TEST FOR NEGATIVE NUMBER.
	MOVM 2,1↔CALL(DTYO,["-"])	;PRINT MINUS SIGN.
	LAC 1,2
L2:	IDIVI 1,12↔PUSH P,2		;MODULO TEN AND SAVE.
	SKIPE 1↔PUSHJ P,L2		;TEST FOR DONE.
	POP P,1↔ADDI 1,60↔CALL(DTYO,1)	;RESTORE & PRINT.
	POP0J
ENDR DECDPY;17-DEC-73(BGB)
;____________________________________________________________________

SUBR(FLODPY,FLONUM,PLACES)	;FLOATING NUMBER DISPLAY.		*
	LAC FLONUM
	JUMPL[CALL(DTYO,["-"])↔LACM FLONUM↔GO .+1]
	LACM 2,PLACES↔CAILE 2,6↔LACI 2,6↔DAC 2,PLACES
	FMPR[1.↔10.↔100.↔1000.↔10000.↔100000.↔1000000.](2)↔FIXX
	IDIV[=1↔=10↔=100↔=1000↔=10000↔=100000↔=1000000](2)
	PUSHP 1↔CALL(DECDPY,0)↔POPP 0
	LAC 2,PLACES
	ADD[=1↔=10↔=100↔=1000↔=10000↔=100000↔=1000000](2)
	PUSHP DPYPTR↔CALL(DECDPY,0)↔POPP 1
	LACI "."↔IDPB 0,1
	POP2J
ENDR FLODPY;17-DEC-73(BGB)